package com.itservice.supporter_navi.utilities;

import static java.lang.Math.*;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.itservice.supporter_navi.MarathonDataBase.MarathonDataBase;
import com.itservice.supporter_navi.MarathonDataBase.libs.DBUtilities;

public class CommonMethod {

	/*コーナーまでの距離算出用メソッド*/
	public static int distance_atob(double lat1, double lon1, double lat2, double lon2) {
		double theta = lon1 - lon2;
        double dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) +  cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta));

        dist = acos(dist);
        dist = rad2deg(dist);

        // *1.609344 でマイル→キロメートル変換
        // *1000 はキロメートル→メートル変換
        int metre = (int)(dist * 60 * 1.1515 * 1.609344 * 1000);

        // コーナーまでの距離を戻す(単位：メートル)
        return metre;
    }

    public static double rad2deg(double radian) {
    	return radian * (180f / Math.PI);
    }
    public static double deg2rad(double degrees) {
    	return degrees * (Math.PI / 180f);
    }



	public static byte[] convertToByteArray(int data) {
		byte[] ret = new byte[4];

		ret[0] = (byte)((data      ) & 0xFF);
		ret[1] = (byte)((data >> 8 ) & 0xFF);
		ret[2] = (byte)((data >> 16) & 0xFF);
		ret[3] = (byte)((data >> 24) & 0xFF);

		return ret;
	}

	/* 補正値算出用メソッド */
	public static String resultPosition(GeoPoint gp_S, GeoPoint gp_E, GeoPoint gp_P){

		double xe;
		double xs;
		double ye;
		double ys;
		double yp;
		double xp;
		double a;
		double b;
		double c;
		double L;
		double ex;
		double ey;
		double vx;
		double vy;
		double k;
		double xq;
		double yq;
		String latlonString;

		xe = gp_E.getLatitudeE6() / 1e6;
		xs = gp_S.getLatitudeE6() / 1e6;
		ye = gp_E.getLongitudeE6() / 1e6;
		ys = gp_S.getLongitudeE6() / 1e6;
		yp = gp_P.getLongitudeE6() / 1e6;
		xp = gp_P.getLatitudeE6() / 1e6;

		a = ye - ys;
		b = xs - xe;
		c = -((a * xs) + (b * ys));
		L = Math.sqrt(Math.pow(xe - xs, 2) + Math.pow(ye - ys, 2));
		ex = (xe - xs) / L;
		ey = (ye - ys) / L;
		vx = -ey;
		vy = ex;
		k = -((a * xp) + (b * yp) + c)/((a * vx) + (b * vy));

		xq = xp + k * vx;
		yq = yp + k * vy;

		latlonString = Double.toString(xq) + "," +  Double.toString(yq) + ",";

		return latlonString;
	}


	//========================================================
	// GPSオンオフチェック
	//========================================================
	public static boolean CheckGPS(Context context){
		String gs = android.provider.Settings.Secure.getString(context.getContentResolver(),
				android.provider.Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
		if (gs.indexOf("gps", 0) < 0) {
			// オフの場合falseを返す
			return false;
		}else{
			// オンの場合はtrueを返す
			return true;
		}
	}

	//========================================================
	// Networkが使えるかを判定する
	//========================================================
	public static boolean CheckNET(Context context){
		ConnectivityManager connectivity = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo network = connectivity.getActiveNetworkInfo();
		if (network == null) {
			// ネットワークが使用不可なのでfalse
			return false;
		} else {
			if (!network.isAvailable()) {
				// 使用不可なのでfalse
				return false;
			} else if (!network.isConnectedOrConnecting()) {
				// 接続中なのでfalse
				return false;
			} else {
				// 使用可能なのでtrue
				return true;
			}
		}
	}

	/*
	 * データベースにフレンド登録
	 * marathonDB:データベースインスタンス
	 * id:登録GCMID
	 * name:登録名
	 * status:フレンド状態
	 */
	public static void registFriendDataBase(MarathonDataBase marathonDB, String id, String name, int status )
	{
		int friendNum = marathonDB.getInteger(DBUtilities.FRIEND_NUM, 0);
		friendNum++;
		// DBへ申請中のフレンド情報を記載
		marathonDB.setInteger(DBUtilities.FRIEND_NUM, friendNum);
		marathonDB.setText(DBUtilities.FRIEND_ID + friendNum, id);
		marathonDB.setText(DBUtilities.FRIEND_NAME + friendNum, name);
		marathonDB.setInteger(DBUtilities.FRIEND_STATUS + friendNum, status);
		Log.v(CommonUtilities.LOG_TAG, "registFriendDataBase FriendNum:" + friendNum);
	}

	/*
	 * データベースのフレンド情報を更新
	 * marathonDB:データベースインスタンス
	 * id:登録GCMID
	 * status:フレンド状態
	 * Return:true:更新成功 false:登録失敗
	 */
	public static Boolean updateFriendDataBase(MarathonDataBase marathonDB, String id, int status )
	{
		int index = marathonDB.friendIdSearch(id);
		Boolean ret = false;

		if(-1 == index)
		{
			int preStatus = marathonDB.getInteger(DBUtilities.FRIEND_STATUS + index, -1);

			// 状態によって変更可能かチェックする。
			switch(preStatus)
			{
			case DBUtilities.FRIEND_STATUS_REGIST_PENDING: // 登録待ち状態
			case DBUtilities.FRIEND_STATUS_REGIST_WAITTING: // 登録申請受信状態
			case DBUtilities.FRIEND_STATUS_RUNNER: // 走者表示状態
				if(status == DBUtilities.FRIEND_STATUS_REGISTERED)
				{
					ret = true;
				}
				break;
			case DBUtilities.FRIEND_STATUS_REGISTERED: // フレンド状態
				if(status == DBUtilities.FRIEND_STATUS_RUNNER)
				{
					ret = true;
				}
				break;
			}

			if(true == ret)
			{
				// 変更OK
				// DBのデータを更新する
				marathonDB.setInteger(DBUtilities.FRIEND_STATUS + index, status);
				Log.v(CommonUtilities.LOG_TAG, "updateFriendDataBase Status:" + status );
			}
			else
			{
				// 変更NG
				Log.v(CommonUtilities.LOG_TAG, "updateFriendDataBase Error:" + status);
			}
		}
		return ret;

	}
}

